package com.ketangpai.admin.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.ketangpai.admin.exception.BusinessException;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Component
public class AliOSSUtil {
    // Endpoint以华东2（北京）为例，其它Region请按实际情况填写。
    private static final String endpoint = "https://oss-cn-beijing.aliyuncs.com";
    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    private static final String accessKeyId = "LTAI5tGcsPJmYtvyYtHvMLLK";
    private static final String accessKeySecret = "f8xOW5cCP6ViorjHiI7WBmSRt2N9Ch";
    private static final String bucketName = "ke-tang-pai";

    /**
     * 将文件上传到阿里OSS
     */
    public String upload(MultipartFile file) {
        InputStream inputStream = null;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 从上传的文件中得到流
        try {
            inputStream = file.getInputStream();
            String oldName = file.getOriginalFilename();
            int lastIndexOf = oldName.lastIndexOf(".");//后缀名前面的 . 的索引
            //获取新的文件名（原文件名+UUID+后缀名）
            String fileName = oldName.substring(0, lastIndexOf) + "-" + UUID.randomUUID().toString().replaceAll("-", "") + oldName.substring(lastIndexOf);
            //要保存文件的目录结构，就是类似于20220102的三级目录
            String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            fileName = dir + "/" + fileName;

            // 创建PutObjectRequest对象。
            // 依次填写Bucket名称（例如examplebucket）、Object完整路径（例如exampledir/exampleobject.txt）和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
            // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream);

            // 上传文件。
            ossClient.putObject(putObjectRequest);

            //文件访问路径
            String[] u1 = endpoint.split("//");
            String url = String.format("https://%s.%s/%s", bucketName, u1[1], fileName);

            // 关闭ossClient
            ossClient.shutdown();
            // 把上传到oss的路径返回
            return url;
        } catch (IOException e) {
            throw new BusinessException("上传文件失败");
        } finally {
            if (null != ossClient) {
                // 关闭OSSClient。
                ossClient.shutdown();
            } else if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
